package com.example.pet.ext;

import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.SelectProvider;
import java.util.List;
/**
 * 扩展mapper接口
 */
public interface ExtMapper<E> {
    /**
     * 通过一个属性获取实体列表
     * @param column 属性Getter方法
     * @param val 属性值
     * @return 实体列表
     */
    @SelectProvider(type = ExtSqlProvider.class,method = "listByOneField")
    List<E> listByOneField(SFunction<E,?> column, Object val);

    /**
     * 通过一个属性获取实体分页列表
     * @param page 分页实体 new Page(currentPage,pageSize)
     * @param column 属性Getter方法
     * @param val 属性值
     * @return 实体列表
     */
    @SelectProvider(type = ExtSqlProvider.class,method = "listByOneField")
    Page<E> pageByOneField(Page page, SFunction<E,?> column, Object val);

    /**
     * 通过一个属性获取实体
     * @param column 属性Getter方法
     * @param val 属性值
     * @return 实体
     */
    @SelectProvider(type = ExtSqlProvider.class,method = "getByOneField")
    E getByOneField(SFunction<E,?> column, Object val);

    /**
     * 通过一个属性删除记录
     * @param column 属性Getter方法
     * @param val 属性值
     * @return 删除记录数
     */
    @DeleteProvider(type = ExtSqlProvider.class,method = "deleteByOneField")
    int deleteByOneField(SFunction<E,?> column, Object val);

    /**
     * 通过两个属性 and 关系获取实体列表
     * @param column1 第一个属性Getter方法
     * @param val1 第一个属性值
     * @param column2 第二个属性Getter方法
     * @param val2 第二个属性值
     * @return 实体列表
     */
    @SelectProvider(type = ExtSqlProvider.class,method = "listByTwoField")
    List<E> listByTwoField(SFunction<E,?> column1, Object val1,SFunction<E,?> column2, Object val2);

    /**
     * 通过两个属性 and 关系获取实体列表
     * @param page 分页实体 new Page(currentPage,pageSize)
     * @param column1 第一个属性Getter方法
     * @param val1 第一个属性值
     * @param column2 第二个属性Getter方法
     * @param val2 第二个属性值
     * @return 实体列表
     */
    @SelectProvider(type = ExtSqlProvider.class,method = "listByTwoField")
    Page<E> pageByTwoField(Page page, SFunction<E,?> column1, Object val1,SFunction<E,?> column2, Object val2);

    /**
     * 通过两个属性 and 关系获取实体
     * @param column1 第一个属性Getter方法
     * @param val1 第一个属性值
     * @param column2 第二个属性Getter方法
     * @param val2 第二个属性值
     * @return 实体
     */
    @SelectProvider(type = ExtSqlProvider.class,method = "getByTwoField")
    E getByTwoField(SFunction<E,?> column1, Object val1,SFunction<E,?> column2, Object val2);

    /**
     * 通过两个属性 and 关系删除记录
     * @param column1 第一个属性Getter方法
     * @param val1 第一个属性值
     * @param column2 第二个属性Getter方法
     * @param val2 第二个属性值
     * @return 删除记录数
     */
    @DeleteProvider(type = ExtSqlProvider.class,method = "deleteByTwoField")
    int deleteByTwoField(SFunction<E,?> column1, Object val1,SFunction<E,?> column2, Object val2);
}